#ifndef __EVENT_CONSUMER_H_
#define __EVENT_CONSUMER_H_

#include <ICE/ICE.h>
#include <IceStorm/IceStorm.h>
#include "collaboration.h"
#include "event.h"

/**
* Clase wrapper para un consumidor de eventos. Para hacer uso
* de esta clase hay que heredar de ella e implementar los metodos "push"
* y "disconnect_push_consumer". Las clases que heredan de esta tienen que
* llamar a su constructor.
*
* @author Carlos Rodriguez Dominguez
*/
class EventConsumer : virtual public Collaboration::EventConsumer {
public:
	/**
	* Constructor
	*
	* @param c Comunicador para el consumidor de eventos
	* @param host Nombre del host
	*/
	EventConsumer(::Ice::CommunicatorPtr& c, const std::string& host);
	
	/**
	* Destructor. Se desconecta del emisor de eventos.
	*/
	virtual ~EventConsumer();
	
	/**
	* Metodo puramente virtual a implementar en las clases que
	* hereden de esta. Este metodo es el que se ejecuta al recibir
	* un evento
	*
	* @param data Datos del evento recibido
	*/
	virtual void push(const ::Collaboration::Event& evt,
                      const ::Ice::Current& c) = 0;
	
protected:
	::Ice::CommunicatorPtr comm; /**< Acceso al comunicador de ICE */
	IceStorm::TopicPrx topic; /**< Topico al que se suscribe */
	Ice::ObjectPrx subscriber; /**< Proxy de suscripcion */
	
	/**
	* Crea el consumidor de eventos
	*/
	void createConsumer(const std::string& host);
};

#endif
